/*
 * Client.h
 *
 *      Author: smirnovaop
 */

#include "sys/types.h"
#include "Debug.h"
#include "Message.h"
#include "Server.h"

#ifndef CLIENT_H_
#define CLIENT_H_

class Client {

public:
	Client();
	/**
	 * Конструктор, связывающие клиент с сервером.
	 * @server - указатель на объект сервер,
	 * с которым будет взаимодействовать клиент.
	 */
	Client(Server* server);

	/**
	 * Отправка сообщения на сервер.
	 * @msg - ссылка на передаваемое сообщение.
	 * @return - 0 - отправка прошла успешно, не ноль - ошибка.
	 */
	int send(Message& msg);

	/**
	 * Регистрация клиента на сервере.
	 * Информация об успешности регистрации выводится на экран.
	 */
	void registration();

	/**
	 * Разрегистрация клиента на сервере.
	 * Информация об успешности регистрации выводится на экран.
	 */
	void unregistration();

	/**
	 * Получение списка зарегистрированных клиентов.
	 * @return - std::vector<u_int32_t> - массив id клиентов.
	 */
	clients getClients();

	/**
	 * Проверка на наличие нового сообщения, прочитанного с сервера.
	 * @return - true - есть новое сообщение, false - нету.
	 */
	bool hasNewMessage();
	u_int32_t getId();

	/**
	 * Чтение прочитанного с сервера сообщения в программу,
	 * использующую эту систему объектов.
	 * При чтении сообщение копируется, в программу передаётся указатель на копию,
	 * а оригинал удаляется.
	 * @return - указатель на копию нового сообщения.
	 */
	Message* readMessage();

	/**
	 * Проверка клиента на регистрацию на сервере.
	 * @return - true - зарегистрирован,
	 * 			 false - не зарегистрирован.
	 */
	bool isRegistered();
	virtual ~Client();
	/**
	 * Для доступа к методу сервера: принятие сообщения.
	 * (recv(Message& msg)).
	 */
	friend class Server;
private:
	bool registered;	//флаг регистрации клиента
	Server* server;		//указатель на сервер
	Message* msg;		//указатель на прочитанное с сервера сообщение
	u_int32_t id;
	static  u_int32_t all_id;
	//receive
	virtual int recv(Message& msg);
};

#endif /* CLIENT_H_ */
